#引入模块
import os
import paramiko
import time
from datetime import datetime
import socket
import openpyxl

#获取当前PC的用户名
pcuser = os.getlogin()

#存放认证失败的设备信息
switch_with_authentication_issue = []

#存放网络不通的设备信息
switch_not_reachable = []

#获取当前目录下的巡检设备.xlsx的表格文件
excel = openpyxl.load_workbook('自动化执行设备清单.xlsx')
sheet = excel['List']           #获取表单
#cell = sheet['B2'].value       #获取某一个表格的数据
row = sheet.max_row             #获取行数

for i in range(2,row+1):
    try:
        a = str(sheet['F' + str(i) + ''].value)      #获取厂商信息

        if a == 'Cisco':
            device_name = str(sheet['B' + str(i) + ''].value)
            ip = str(sheet['C' + str(i) + ''].value)
            username = str(sheet['D' + str(i) + ''].value)
            password = str(sheet['E' + str(i) + ''].value)
            ssh_client = paramiko.SSHClient()
            ssh_client.set_missing_host_key_policy(
                paramiko.AutoAddPolicy())  #自动添加策略，保存服务器的主机名和密钥信息，如果添加不成功，那么不再本地know_hosts文件中记录的主机将无法连接
            ssh_client.connect(hostname=ip, username=username, password=password)
            command = ssh_client.invoke_shell()

            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m已经成功登陆交换机' + ' ' + ip, '\033[0m')
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m已获取' + ' ' + ip + '设备的所属厂商，为' + ' ' + a + '\033[0m')
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')

            cli_sheet = excel['Cisco_Commands']
            row = cli_sheet.max_row
            for i in range(1, row + 1):
                print('执行'+str(cli_sheet['A' + str(i)].value))
                command.send(str(cli_sheet['A' + str(i)].value) + '\n')
                time.sleep(5)

            #抓取回显，放入output变量
            output = command.recv(99999999999)

            #设定now值，当前时间为变量
            now = datetime.now()

            #打开文件
            backup = open(
                'C:\\Users\\' + pcuser + '\\Documents\\' + str(device_name) + '-' + str(now.year) + "-" + str(
                    now.month) + "-" + str(now.day) + "巡检-" + ip + ".txt", "wb")
            #将回显output写入文件
            backup.write(output)
            #关闭文件
            backup.close()

            #在交互窗户回显
            print(output.decode("ascii"))

            #关闭SSH
            ssh_client.close()
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m执行完毕，已退出登录' + ' ' + ip + '\033[0m')
        elif a =='Huawei':
            device_name = str(sheet['B' + str(i) + ''].value)
            ip = str(sheet['C' + str(i) + ''].value)
            username = str(sheet['D' + str(i) + ''].value)
            password = str(sheet['E' + str(i) + ''].value)
            ssh_client = paramiko.SSHClient()
            ssh_client.set_missing_host_key_policy(
                paramiko.AutoAddPolicy())  # 自动添加策略，保存服务器的主机名和密钥信息，如果添加不成功，那么不再本地know_hosts文件中记录的主机将无法连接
            ssh_client.connect(hostname=ip, username=username, password=password)
            command = ssh_client.invoke_shell()

            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m已经成功登陆交换机' + ' ' + ip, '\033[0m')
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m已获取' + ' ' + ip + '设备的所属厂商，为' + ' ' + a + '\033[0m')
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')

            cli_sheet = excel['Huawei_Commands']
            row = cli_sheet.max_row
            for i in range(1, row + 1):
                print('执行' + str(cli_sheet['A' + str(i)].value))
                command.send(str(cli_sheet['A' + str(i)].value) + '\n')
                time.sleep(5)

            #抓取回显，放入output变量
            output = command.recv(99999999999)

            #设定now值，当前时间为变量
            now = datetime.now()

            #打开文件
            backup = open(
                'C:\\Users\\' + pcuser + '\\Documents\\' + str(device_name) + '-' + str(now.year) + "-" + str(
                    now.month) + "-" + str(now.day) + "巡检-" + ip + ".txt", "wb")
            #将回显output写入文件
            backup.write(output)
            #关闭文件
            backup.close()

            #在交互窗户回显
            print(output.decode("ascii"))

            #关闭SSH
            ssh_client.close()
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m执行完毕，已退出登录' + ' ' + ip + '\033[0m')
        elif a == 'H3C':
            device_name = str(sheet['B' + str(i) + ''].value)
            ip = str(sheet['C' + str(i) + ''].value)
            username = str(sheet['D' + str(i) + ''].value)
            password = str(sheet['E' + str(i) + ''].value)
            ssh_client = paramiko.SSHClient()
            ssh_client.set_missing_host_key_policy(
                paramiko.AutoAddPolicy())  # 自动添加策略，保存服务器的主机名和密钥信息，如果添加不成功，那么不再本地know_hosts文件中记录的主机将无法连接
            ssh_client.connect(hostname=ip, username=username, password=password)
            command = ssh_client.invoke_shell()

            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m已经成功登陆交换机' + ' ' + ip, '\033[0m')
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m已获取' + ' ' + ip + '设备的所属厂商，为' + ' ' + a + '\033[0m')
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')

            cli_sheet = excel['H3C_Commands']
            row = cli_sheet.max_row
            for i in range(1, row + 1):
                print('执行' + str(cli_sheet['A' + str(i)].value))
                command.send(str(cli_sheet['A' + str(i)].value) + '\n')
                time.sleep(5)

            #抓取回显，放入output变量
            output = command.recv(99999999999)

            #设定now值，当前时间为变量
            now = datetime.now()

            #打开文件
            backup = open(
                'C:\\Users\\' + pcuser + '\\Documents\\' + str(device_name) + '-' + str(now.year) + "-" + str(
                    now.month) + "-" + str(now.day) + "巡检-" + ip + ".txt", "wb")
            #将回显output写入文件
            backup.write(output)
            #关闭文件
            backup.close()

            #在交互窗户回显
            print(output.decode("ascii"))

            #关闭SSH
            ssh_client.close()
            print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
            print('\033[42m执行完毕，已退出登录' + ' ' + ip + '\033[0m')
        else :
            print('IP地址为'+ ip + '的设备，目前没有规划命令！')

    except paramiko.ssh_exception.AuthenticationException:
        print(ip + "用户验证失败！")
        switch_with_authentication_issue.append(ip)
    except socket.error:
        print(ip + "目标不可达！")
        switch_not_reachable.append(ip)

print(' \n 下列交换机用户验证失败：')
for i in switch_with_authentication_issue:
    print(i)

print(' \n 下列交换机不可达：')
for i in switch_not_reachable:
    print(i)

os.system("pause")